home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / ipfile.c < prev    next >
C/C++ Source or Header  |  1991-05-29  |  3KB  |  125 lines

  1. /* @(#) $Header: ipfile.c,v 1.8 91/05/29 12:02:03 deyke Exp $ */
  2.  
  3. #include <stdio.h>
  4.  
  5. #include "global.h"
  6. #include "timer.h"
  7. #include "iface.h"
  8. #include "ip.h"
  9.  
  10. #define ROUTE_FILE_VERSION   2
  11. #define ROUTE_SAVETIME       (60L*10)
  12.  
  13. struct route_saverecord_1 {
  14.   int32 target;         /* Target IP address */
  15.   unsigned int  bits;   /* Number of significant bits */
  16.   int32 gateway;        /* IP address of local gateway for this target */
  17.   int32 metric;         /* Hop count or whatever */
  18.   int  flags;
  19. };
  20.  
  21. struct route_saverecord_2 {
  22.   int32 target;         /* Target IP address */
  23.   unsigned int  bits;   /* Number of significant bits */
  24.   int32 gateway;        /* IP address of local gateway for this target */
  25.   int32 metric;         /* Hop count or whatever */
  26.   int  flags;
  27.   int32 expires;
  28. };
  29.  
  30. static char  route_filename[] = "/tcp/route_data";
  31. static char  route_tmpfilename[] = "/tcp/route_tmp";
  32.  
  33. /*---------------------------------------------------------------------------*/
  34.  
  35. void route_savefile()
  36. {
  37.  
  38.   FILE * fp;
  39.   int  bits;
  40.   int  i;
  41.   static long  nextsavetime;
  42.   struct route *p;
  43.   struct route_saverecord_2 buf;
  44.  
  45.   if (!nextsavetime) nextsavetime = secclock() + ROUTE_SAVETIME;
  46.   if (Debug || nextsavetime > secclock()) return;
  47.   nextsavetime = secclock() + ROUTE_SAVETIME;
  48.   if (!(fp = fopen(route_tmpfilename, "w"))) return;
  49.   putc(ROUTE_FILE_VERSION, fp);
  50.   rt_merge(0);
  51.   for (bits = 1; bits <= 32; bits++)
  52.     for (i = 0; i < HASHMOD; i++)
  53.       for (p = Routes[bits-1][i]; p; p = p->next)
  54.     if (run_timer(&p->timer)) {
  55.       buf.target = p->target;
  56.       buf.bits = p->bits;
  57.       buf.gateway = p->gateway;
  58.       buf.metric = p->metric;
  59.       buf.flags = p->flags;
  60.       buf.expires = secclock() + read_timer(&p->timer) / 1000;
  61.       fwrite((char *) &buf, sizeof(buf), 1, fp);
  62.       fwrite(p->iface->name, strlen(p->iface->name) + 1, 1, fp);
  63.     }
  64.   fclose(fp);
  65.   rename(route_tmpfilename, route_filename);
  66. }
  67.  
  68. /*---------------------------------------------------------------------------*/
  69.  
  70. void route_loadfile()
  71. {
  72.  
  73.   FILE * fp;
  74.   char  *cp;
  75.   char  ifname[1024];
  76.   int  c;
  77.   int32 ttl;
  78.   static int  done;
  79.   struct iface *ifp;
  80.  
  81.   if (done) return;
  82.   done = 1;
  83.   if (Debug || !(fp = fopen(route_filename, "r"))) return;
  84.   switch (getc(fp)) {
  85.   case 1:
  86.     {
  87.       struct route_saverecord_1 buf;
  88.       while (fread((char *) &buf, sizeof(buf), 1, fp)) {
  89.     cp = ifname;
  90.     do {
  91.       if ((c = getc(fp)) == EOF) {
  92.         fclose(fp);
  93.         return;
  94.       }
  95.     } while (*cp++ = c);
  96.     for (ifp = Ifaces; ifp && strcmp(ifp->name, ifname); ifp = ifp->next) ;
  97.     if (ifp)
  98.       rt_add(buf.target, buf.bits, buf.gateway, ifp, buf.metric,
  99.          0x7fffffff / 1000, buf.flags & RTPRIVATE);
  100.       }
  101.     }
  102.     break;
  103.   case 2:
  104.     {
  105.       struct route_saverecord_2 buf;
  106.       while (fread((char *) &buf, sizeof(buf), 1, fp)) {
  107.     cp = ifname;
  108.     do {
  109.       if ((c = getc(fp)) == EOF) {
  110.         fclose(fp);
  111.         return;
  112.       }
  113.     } while (*cp++ = c);
  114.     for (ifp = Ifaces; ifp && strcmp(ifp->name, ifname); ifp = ifp->next) ;
  115.     if (ifp && (ttl = buf.expires - secclock()) > 0)
  116.       rt_add(buf.target, buf.bits, buf.gateway, ifp, buf.metric,
  117.          ttl, buf.flags & RTPRIVATE);
  118.       }
  119.     }
  120.     break;
  121.   }
  122.   fclose(fp);
  123. }
  124.  
  125.